/**
 @file cliMsgDef.h
 @brief Definición de los parámetros para la interfaz del usuario con el servicio de intercambio de mensajes.
 @date   7/12/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef CLIMSGDEF_H_
#define CLIMSGDEF_H_

#include <inttypes.h>

//! @brief Tiempo máximo de espera  por la respuesta a un comando en segundos.@see getResponse()
#define GET_RESPONSE_TIMEOUT_SEC 0

//! @brief Tiempo máximo de espera  por la respuesta a un comando en milisegundos.@see getResponse()
#define GET_RESPONSE_TIMEOUT_MSEC 210 //500

//! @brief Tiempo máximo de espera para enviar a través del socket en milisegundos.
#define SOCKET_SEND_TIMEOUT_MSEC 100

//! @brief Nombre del servicio de intercambio de mensajes en el directorio de servicios.
#define SOCKET_SERVICE_NAME "xbee"

//! @brief Tiempo máximo de espera para recibir del socket en milisegundos.
#define SOCKET_RCV_TIMEOUT_MSEC 100

//! @brief Tiempo máximo de espera en segundos por el valor de retorno de un comando enviado en unicast.@see sendMessage()
#define SEND_MSG_RETURN_TIMEOUT_SEC 0

//! @brief Tiempo máximo de espera en milisegundos por el valor de retorno de un comando enviado en unicast.@see sendMessage()
#define SEND_MSG_RETURN_TIMEOUT_MSEC 195//prev 1300, 195

//! @brief Tiempo máximo de espera en segundos por el valor de retorno de un comando enviado en multicast.@see sendMulticast()
#define SEND_MULTICAST_RETURN_TIMEOUT_SEC 0 //prev 1

//! @brief Tiempo máximo de espera en milisegundos por el valor de retorno de un comando enviado en multicast.@see sendMulticast()
#define SEND_MULTICAST_RETURN_TIMEOUT_MSEC 190 //prev 0

//! @brief Tiempo máximo de espera en milisegundos de una solicitud de lista de nodos.@see requestNodeList()
#define NODE_LIST_REQUEST_TIMEOUT_SEC 1

//! @brief Tiempo máximo de espera en milisegundos de una solicitud de lista de nodos.@see requestNodeList()
#define NODE_LIST_REQUEST_TIMEOUT_MSEC 0

//! @brief Tiempo máximo de espera en segundos de una solicitud de actualización de la lista de nodos.@see updateNodeList()
#define NODE_LIST_UPDATE_TIMEOUT_SEC 5

//! @brief Dirección del cliente para el socket con el servicio de intercambio de mensajes.
//#define CLI_SOCKET_ADDR "/tmp/xbclient"

//! @brief Dirección del servidor para el socket con el servicio de intercambio de mensajes.
//#define SERVER_SOCKET_ADDR "/tmp/xbserver"

//! @brief Nombre del host donde se encuentra el servicio de intercambio de mensajes.
#define SERVER_SOCKET_NAME "localhost"

//! @brief Nombre del servicio de intercambio de mensajes en el directorio de servicios.
#define SOCKET_SERVICE_NAME "xbee"

//transport layer options----------------------------------
//! @brief Bit que indica que el mensaje se transmitirá en broadcast. Los receptores lo usarán para evitar enviar un ACK.
#define BROADCAST_BIT 0b10000000

//! @brief Bit para indicar al servidor que transmita el mensaje en multicast.
#define MULTICAST_BIT 0b00100000

//! @brief Bit para indicar al servidor que el comando a enviar acarrea un mensaje de respuesta.
#define RESPONSE_REQUIRED_BIT 0b00010000

//! @brief Tamaño máximo admitido de la data en tramas de capa aplicación enviadas.
#define MAX_MSG_DATA_LEN 24

//! @brief Identificador de nodo especial para la transmisión en broadcast.
#define BROADCAST_ID "broadcast"

//App layer packet types-------------------------------------
//! @brief Identificador de mensaje para los acuses de recibo.
#define ACK 0x1A

#define PING 0x70

//! @brief Identificador de mensaje para solicitar la lista de nodos al servidor.
#define NODE_LIST 0x22

//! @brief Identificador de mensaje para actualizar la lista de nodos del servidor.
#define NODE_LIST_UPDATE 0x23

//-----------------------------------------------------------

//! @brief Estructura de datos para almacenar la lista de nodos.
typedef struct{
    char id[20]; //!< identificador del nodo
} node_t;

//! @brief Estructura para almacenar una trama de capa aplicación.
struct msg_t {
    uint8_t options; //!< Byte de opciones.
    uint8_t type; //!< Identificador del comando o mensaje enviado.
    uint8_t len; //!< Tamaño de la data en el mensaje.
    uint8_t data[MAX_MSG_DATA_LEN]; //!< Contenedor de la data.
    char nodeId[20]; //!< Identificador del nodo origen/destino.
};

#endif /* CLIMSGDEF_H_ */
